/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.celiosilva.simbanc.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author celio@celiosilva.com
 */
public class Sorteador<P> {

    private final           List<P>                 participantes;
    private final           List<P>                 contemplados;
    private                 Iterator<P>             iteradorSorteados;

    public Sorteador() {
        contemplados = new LinkedList<P>();
        participantes = new ArrayList<P>();
    }

    public Sorteador(List<P> participantes) {
        this();
        this.participantes.addAll(participantes);
    }

    public Sorteador(P[] participantes) {
        this(Arrays.asList(participantes));
    }

    public void addParticipantes(P[] participantes){
        this.participantes.addAll(Arrays.asList(participantes));
    }

    public void setParticipantes(P[] participantes){
        this.participantes.clear();
        this.addParticipantes(participantes);
    }
    
    public void addParticipantes(List<? extends P> participantes){
        this.participantes.addAll(participantes);
    }

    public void setParticipantes(List<? extends P> participantes){
        this.participantes.clear();
        this.addParticipantes(participantes);
    }

    public void addParticipante(P p){
        this.participantes.add(p);
    }

    public List<P> sortear(int totalPremiados){
        int totalParticipantes = this.participantes.size();

        while (contemplados.size() < totalPremiados){
            int numeroSorteado = (int)(Math.random() * totalParticipantes--);
            contemplados.add(participantes.remove(numeroSorteado));
        }
        this.iteradorSorteados = contemplados.iterator();
        return contemplados;
    }

    public boolean hasContemplado(){
        return iteradorSorteados.hasNext();
    }

    public P getProximoContemplado(){
        return iteradorSorteados.next();
    }

}